/*
 * Copyright (C) 2012 Tomas Shestakov. <http://code.google.com/p/jmmo/>
 */

package jmmo.engine.event

/**
 * The parent of all the events.
 * All events should be inheriting from this class.
 * But instances of this class should be created only in rare cases.
 * <p></p>
 * Родитель всех событий.
 * Все события должны быть унаследованны от данного класса.
 * Но экземпляры этого класса должны создаваться лишь в редких случаях.
 * @param source source of the event
 * @author Tomas Shestakov
 */
class Event(val source: AnyRef) extends Serializable {
  jmmo.util.requireNonNull(source, "Event source cannot be null")
}

object Event {

  /**
   * Class of parent of all the events
   */
  val Root = classOf[Event]

  /**
   * Creates instance of the Event with the specified event source.
   * @param source source of the event
   * @return new instance of the Event class
   */
  def apply(source: AnyRef) = new Event(source)

  def unapply(event: Event): Option[AnyRef] = if (event eq null) None else Some(event.source)
}
